2장. 모델은 무엇을 먹고 어떻게 답을 고르나
출처: 『AI 엔지니어링』(Chip Huyen 지음, 한국어판) | 원서: AI Engineering (O'Reilly) 2장 대응
코드는 분위기만 — Python·import 같은 말은 몰라도 됩니다. 표의 '비유'와 '위험'만 봐도 충분해요.
이 장은 파운데이션 모델 속을 살짝 들여다본다.
다만 부품 하나하나를 외우는 게 목적이 아니다.
딱 두 가지 질문만 답하면 된다.
"이 모델은 무엇을 먹고 자랐나?" 그리고 "답을 어떻게 고르나?"
이 두 질문이 모델의 한계와 성격을 거의 다 설명한다.
0. 이 장의 새 단어
0장 용어집에 없던 말만 여기 모아 둔다.
이 셋만 새로 알면 이 장은 끝난다.
세 단어 모두 [한 문장 뜻 + 일상비유 + 한 줄 예] 3종으로 적었다.
학습 데이터(training data)
한 문장 뜻 — 모델을 만들 때 먹인 글·자료 더미. 모델이 할 수 있는 일의 한계를 여기서 정한다.
일상비유 — 사람이 읽고 자란 책장. 요리책만 읽고 자란 사람에게 물리 문제를 물으면 못 푼다. 안 읽은 건 모른다.
한 줄 예 —
# 한국어 자료를 안 먹였으면 한국어를 잘 못함
model = train(data=영어_더미_only)
model.ask("이 문장 한국어로 번역해줘") # → 어색함
샘플링(sampling)
한 문장 뜻 — 모델이 다음에 올 단어를 후보들 중에서 골라 뽑는 일.
일상비유 — 제비뽑기. 통 안에 단어 쪽지가 들어 있고, 흔한 단어일수록 쪽지가 많아 더 잘 뽑힌다. 매번 뽑으니 매번 조금씩 달라진다.
한 줄 예 —
# 같은 질문이어도 뽑힐 때마다 단어가 조금씩 다를 수 있음
model.ask("바다를 한 단어로?") # → "파랑" 또는 "넓음"
온도(temperature)
한 문장 뜻 — 샘플링할 때 '얼마나 모험할지'를 정하는 손잡이. 높이면 엉뚱한 단어도 잘 나오고, 낮추면 가장 무난한 단어만 나온다.
일상비유 — 음악 볼륨이 아니라 '대담함' 다이얼. 0에 가까우면 늘 안전한 답, 높이면 의외의 답이 튀어나온다.
한 줄 예 —
# 같은 질문, 손잡이만 다르게
model.ask("색 하나 말해줘", temperature=0.1) # → 거의 항상 "파랑"
model.ask("색 하나 말해줘", temperature=1.5) # → "청록"·"감색" 같은 것도 나옴
(귀납 도입) 이런 적 있죠?
어떤 사람이 AI 번역기에 한국어를 넣었다.
영어로는 술술 잘 되던 번역이, 잘 안 쓰는 작은 언어로는 엉망이 됐다.
번역 품질이 언어마다 들쭉날쭉했던 것이다.
"같은 모델인데 왜 어떤 언어는 잘하고 어떤 언어는 못하지?"
답은 단순하다.
그 모델이 자라며 읽은 자료에 영어는 산더미였고, 작은 언어는 거의 없었다.
안 읽은 건 못 한다.
이게 학습 데이터다.
모델이 무엇을 먹고 자랐는지가, 모델이 무엇을 할 수 있는지를 정한다.
방금 그 사람은 모델 탓을 했지만, 진짜 원인은 '먹인 자료'였다.
이번엔 다른 장면.
어떤 사람이 챗봇에 똑같은 질문을 두 번 했다.
그런데 답이 미묘하게 달랐다.
"고장 났나?" 싶었지만 고장이 아니다.
모델은 다음 단어를 매번 제비뽑기로 고른다.
이게 샘플링이다.
그리고 그 제비뽑기를 '얼마나 대담하게' 할지 정하는 손잡이가 온도다.
이 한 장면이 모델의 성격을 거의 다 설명한다.
이 장에서 딱 3가지만
- 모델은 먹은 만큼만 안다. 학습 데이터에 없으면 못 한다. 영어 자료가 압도적으로 많아서, 작은 언어는 약하고 돈도 더 든다.
- 모델은 답을 제비뽑기(샘플링)로 고른다. 그래서 같은 질문에도 답이 매번 조금씩 다르다.
- 온도 손잡이로 성격을 바꾼다. 낮추면 또박또박 일관, 높이면 자유롭게 창의. 일이 정확해야 하면 낮추고, 톡톡 튀어야 하면 올린다.
이 셋만 들고 가면 된다.
나머지는 곁가지다.
개념 1 — 모델은 먹은 만큼만 안다 (학습 데이터)
망가지는 장면
회사에서 작은 언어를 쓰는 고객을 위해 AI 번역 서비스를 붙였다.
영어 데모는 완벽했다.
그런데 실제 고객 언어로 돌리자 번역이 자꾸 헛돌고, 비용 청구서도 영어보다 훨씬 컸다.
알고 보니 그 모델이 자라며 읽은 자료의 거의 절반이 영어였고, 고객 언어는 0.01%도 안 됐다.
일상비유
요리책만 잔뜩 읽고 자란 사람이 있다.
요리는 척척 하지만, 물리 문제를 물으면 멍해진다.
읽은 적이 없으니 모른다.
모델도 똑같다. 먹인 자료에 있는 만큼만 잘한다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 많이 읽은 분야(영어) | train(data=영어_산더미) |
안전 — 잘함 |
| 거의 안 읽은 분야(작은 언어) | train(data=거의_없음) |
못함 + 토큰 더 먹어 비용↑ |
한 문장 정의 — 학습 데이터는 모델을 만들 때 먹인 자료 더미이며, 모델이 할 수 있는 일의 한계를 처음부터 정해 버린다.
가장 단순한 규칙 하나. 모델 고르기 전에 "이 모델이 내 분야·내 언어를 충분히 먹었나?"부터 확인한다.
예시 폭격 — 학습 데이터
예시 1 (worked-example, 완성된 풀이).
상황: 영어 문장 1개를 옮기는 데 모델이 7토큰을 쓴다.
같은 뜻의 작은 언어 문장은 70토큰을 쓴다.
토큰만큼 돈이 나간다.
결론: 같은 한 문장인데 작은 언어 쪽이 약 10배 비싸다.
데이터가 적은 언어는 모델이 쪼개는 솜씨도 서툴러, 토큰이 불어나기 때문이다.
# 같은 의미, 언어만 다름
english = count_tokens("Hello, how are you?") # → 7
small = count_tokens("<작은 언어로 같은 인사>") # → 70
# 70 / 7 = 약 10배 비용
예시 2 (before / after).
before — "AI니까 모든 언어를 똑같이 잘하겠지" 하고 작은 언어 서비스를 그냥 출시.
결과: 번역 엉망 + 청구서 폭발.
after — 출시 전에 "이 모델 학습 데이터에 이 언어 비율이 얼마나 되나?"를 확인.
비율이 너무 낮으면 그 언어 자료를 따로 더 먹인 모델(파인튜닝)을 쓰거나 다른 모델을 고른다.
예시 3 (부분완성 — 빈칸을 채워 보기).
의료 진단을 돕는 AI를 만든다고 하자.
범용 모델은 인터넷 잡글을 주로 먹어서 ____ 자료는 거의 못 봤다.
그래서 ____ 데이터를 따로 먹인 특화 모델을 쓰거나 파인튜닝해야 한다.
(빈칸 둘 다 정답: 의료/전문)
예시 4 (독립 적용 — 스스로 판단).
당신 회사는 한국어 법률 문서를 요약하는 앱을 만든다.
질문: 모델을 고를 때 무엇부터 확인해야 할까?
스스로 답해 보고, 아래 미니 시나리오와 맞춰 보자.
미니 시나리오 — "이럴 때 이렇게".
상황: 작은 언어 고객 지원 챗봇을 출시하려는데 품질이 불안하다.
이렇게: ① 그 언어가 모델 학습 데이터에서 얼마나 되는지 확인한다. ② 너무 적으면 그 언어 자료를 추가로 먹인 모델(파인튜닝)을 쓴다. ③ 토큰 비용이 영어보다 몇 배인지 미리 계산해 예산에 반영한다.
한 걸음 더 ▸ (지금 몰라도 됨)
"데이터는 양이 중요할까, 질이 중요할까?" 같은 균형 판단은 더 깊은 주제다. 지금은 "먹은 만큼만 안다, 내 분야·언어를 먹었는지부터 본다" 한 줄만 들고 가면 충분하다.
개념 2 — 답을 제비뽑기로 고른다 (샘플링)
망가지는 장면
테스트하던 개발자가 챗봇에 같은 질문을 두 번 던졌다.
답이 미묘하게 달랐다.
"버그인가?" 싶어 한참 코드를 뒤졌지만 버그가 아니었다.
모델은 원래 답을 매번 제비뽑기로 고르기 때문이다.
일상비유
단어 쪽지가 든 제비뽑기 통을 떠올리자.
흔한 단어일수록 쪽지가 많아 잘 뽑히고, 드문 단어는 쪽지가 적어 가끔만 뽑힌다.
매번 새로 뽑으니, 같은 질문이라도 결과가 조금씩 달라진다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 매번 새로 제비뽑기 | model.ask(질문) 두 번 |
답이 매번 조금 다름 — 정상 |
| 늘 같은 답을 기대 | assert 답1 == 답2 |
깨짐 — 모델은 원래 안 똑같음 |
한 문장 정의 — 샘플링은 모델이 다음 단어를 후보들 중에서 확률에 따라 뽑는 과정이며, 이 뽑기 때문에 같은 질문에도 답이 매번 달라질 수 있다.
가장 단순한 규칙 하나. "AI 답은 매번 똑같다"고 가정하지 않는다. 답이 달라지는 건 고장이 아니라 본래 성질이다.
예시 폭격 — 샘플링
예시 1 (worked-example, 완성된 풀이).
질문: "바다 하면 떠오르는 단어 하나?"
통 안 쪽지: '파랑' 60장, '넓음' 31장, '소금' 8장.
첫 번째 뽑기 → '파랑'.
두 번째 뽑기 → '넓음'.
둘 다 틀린 게 아니다. 그냥 쪽지 수에 따라 다르게 뽑힌 것뿐이다.
# 확률이 높은 단어가 더 자주, 하지만 항상은 아님
model.ask("바다 하면 떠오르는 단어 하나?") # → "파랑"
model.ask("바다 하면 떠오르는 단어 하나?") # → "넓음"
예시 2 (before / after).
before — 테스트 코드에 답 == "파랑"이라고 못 박았다.
결과: 어느 날 '넓음'이 뽑혀 테스트가 깨지고, 개발자는 멀쩡한 모델을 의심하며 시간을 날렸다.
after — "정답 후보 여럿 중 하나면 통과"로 기준을 바꿨다.
결과: 모델의 본래 성질을 인정하니 헛수고가 사라졌다.
예시 3 (부분완성 — 빈칸을 채워 보기).
샘플링은 다음 단어를 ____에 따라 뽑는 일이다.
그래서 같은 질문에도 답이 ____ 수 있다.
(빈칸 정답: 확률 / 달라질)
예시 4 (독립 적용 — 스스로 판단).
당신은 챗봇 답이 매번 조금씩 다르다는 고객 항의를 받았다.
질문: 이건 고쳐야 할 버그일까, 모델의 정상 성질일까?
스스로 답한 뒤 아래 미니 시나리오와 맞춰 보자.
미니 시나리오 — "이럴 때 이렇게".
상황: "답이 매번 다르다"는 항의가 들어왔다.
이렇게: ① 먼저 "이건 샘플링 때문에 생기는 정상 현상"임을 안다. ② 그래도 일관성이 꼭 필요하면 온도를 낮춘다(개념 3). ③ 같은 입력에 같은 답이 절실하면, 이전 답을 저장해 두고 다시 쓰는 방법도 있다.
한 걸음 더 ▸ (지금 몰라도 됨)
제비뽑기 통에서 '쪽지가 적은 단어까지 후보에 넣을지' 같은 세밀한 조절 방법도 있다. 지금은 "답은 제비뽑기라 매번 조금 다르다" 한 줄이면 충분하다.
개념 3 — 온도 손잡이로 성격을 바꾼다 (온도)
망가지는 장면
같은 모델로 두 가지 일을 시켰다.
하나는 금액 계산 같은 정확한 일, 하나는 광고 문구처럼 톡톡 튀는 일.
그런데 둘 다 한 가지 설정으로 돌렸더니, 계산은 가끔 엉뚱하고 광고는 지루했다.
손잡이 하나만 바꿨으면 둘 다 좋아졌을 텐데, 그걸 몰랐던 것이다.
일상비유
'대담함' 다이얼을 떠올리자.
0에 가까우면 늘 가장 무난한 답만 고른다. 또박또박, 매번 비슷하다.
높이 올리면 의외의 단어도 과감히 고른다. 자유롭지만 가끔 엉뚱하다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 다이얼 낮춤 | ask(..., temperature=0.1) |
일관·정확 — 대신 좀 밋밋 |
| 다이얼 높임 | ask(..., temperature=1.5) |
창의·다양 — 대신 가끔 엉뚱 |
한 문장 정의 — 온도는 샘플링이 얼마나 모험할지를 정하는 손잡이이며, 낮추면 무난하고 일관된 답이, 높이면 다양하고 창의적인 답이 나온다.
가장 단순한 규칙 하나. 정확함이 중요하면 온도를 낮추고, 새로움이 중요하면 온도를 올린다.
예시 폭격 — 온도
예시 1 (worked-example, 완성된 풀이).
일: 의료 안내문을 정확하게 써야 한다.
선택: 온도 0.1.
이유: 안내문은 매번 똑같이, 정확해야 한다. 엉뚱한 단어가 튀면 위험하다.
# 정확함이 생명인 일 → 낮은 온도
ask("이 약 복용 안내문을 정확히 써줘", temperature=0.1)
예시 2 (다른 상황, 반대 선택).
일: 새 음료 광고 카피 10개를 뽑아야 한다.
선택: 온도 1.0~1.2.
이유: 비슷한 문구 10개는 쓸모없다. 서로 다르고 톡톡 튀어야 한다.
# 다양함이 생명인 일 → 높은 온도
ask("이 음료 광고 카피 10개 뽑아줘", temperature=1.2)
예시 3 (before / after).
before — 코드 생성에 온도를 1.5로 뒀다.
결과: 매번 다른 코드가 나와 어떤 건 동작하고 어떤 건 깨졌다.
after — 코드 생성 온도를 0.1로 낮췄다.
결과: 안정적이고 예측 가능한 코드가 나왔다.
예시 4 (부분완성 — 빈칸을 채워 보기).
법률 요약처럼 _이 중요한 일에는 온도를 _.
브레인스토밍처럼 _가 중요한 일에는 온도를 _.
(빈칸 정답: 정확함 / 낮춘다 / 새로움(다양함) / 올린다)
예시 5 (독립 적용 — 스스로 판단).
당신은 고객 문의에 늘 같은 표준 답을 줘야 하는 챗봇을 만든다.
질문: 온도를 높일까 낮출까? 왜?
스스로 답한 뒤 아래 미니 시나리오와 맞춰 보자.
미니 시나리오 — "이럴 때 이렇게".
상황: 한 모델로 '정확한 안내'와 '창의적 카피'를 둘 다 해야 한다.
이렇게: ① 정확한 안내 요청에는 온도를 낮게(예: 0.1~0.3) 둔다. ② 창의적 카피 요청에는 온도를 높게(예: 1.0~1.2) 둔다. ③ 일마다 손잡이를 따로 잡는다. 한 설정으로 다 하려 하지 않는다.
한 걸음 더 ▸ (지금 몰라도 됨)
온도 말고도 후보 단어 수를 직접 줄이는 다른 손잡이들도 있다. 지금은 "정확하면 낮추고, 창의면 올린다" 한 줄이면 충분하다.
정리 — 가장 단순한 행동 규칙
먹은 만큼만 안다. 모델 고르기 전, 내 분야·내 언어를 충분히 먹었는지부터 본다.
답은 제비뽑기다. 답이 매번 조금 달라지는 건 고장이 아니라 본래 성질이다.
온도로 성격을 잡는다. 정확함이 중요하면 낮추고, 새로움이 중요하면 올린다.
다음 장 예고 1줄. 다음 장에서는 모델 답이 좋은지 나쁜지 '채점'하는 법을 본다. (지금 몰라도 됩니다 — 다음 장에서 풀려요.)
클릭하거나 Space를 눌러 뒤집기